#pragma once

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>

void Open()
{
    std::cout << "这是一个打开的任务" << std::endl;
}
void Download()
{
    std::cout << "这是一个下载的任务" << std::endl;
}
void Upload()
{
    std::cout << "这是一个上传的任务" << std::endl;
}

typedef void (*task_t)();
class Task
{
public:
    Task(task_t task) : _task(task)
    {
    }
    ~Task()
    {
    }
    void operator()() const
    {
        _task();
    }
    task_t getTask() const {return _task;}
private:
    task_t _task;
};

class TaskManager
{
public:
    TaskManager()
    {
        // 设置种子数，采用随机任务形式
        srand((unsigned)time(nullptr));
        Register(Open);
        Register(Download);
        Register(Upload);
    }
    // 注册任务
    void Register(task_t t)
    {
        _tasks.emplace_back(t);
    }
    // 返回任务码
    int TaskCode() const
    {
        int ret = rand() % _tasks.size();
        return ret;
    }
    void ExecuteTask(int taskcode) const
    {
        if (taskcode < 0 || taskcode >= _tasks.size())
        {
            std::cout << "读取的任务码无效" << std::endl;
            return;
        }
        printf("进程：%d执行任务，taskcode为:%d\n",getpid(),taskcode);
        _tasks[taskcode]();
        printf("任务：%d 执行完毕\n",taskcode);
    }
    ~TaskManager()
    {
    }

private:
    std::vector<Task> _tasks;
};